home *** CD-ROM | disk | FTP | other *** search
/ PCMania 64 / PCMania CD64_1.iso / phy / phy004 / files / articulo.021 < prev    next >
Encoding:
Text File  |  1997-06-11  |  3.7 KB  |  105 lines

  1. *cX          OPTIMIZACION EN ASSEMBLER 
  2. *cR
  3.   En  esta  serie  de  artículos  trataré  de
  4. enseñaros cosas sobre optimización de  código
  5. y pequeños truquillos que harán  que  vuestro
  6. programa en ensamblador gane en  velocidad  y
  7. elegancia.
  8. *cT
  9. OPTIMIZACION EN COMPARACIONES
  10. *cR
  11.   En  una  instrucción  de  comparación,  hay
  12. ciertas cosas que tenemos que tener  en cuen-
  13. ta.
  14.   Tomemos como ejemplo *cYCMP  AX,  2121h*cR.  Esta
  15. instrucción simula una resta a  *cYAX*cR  de  *cY2121h*cR
  16. unidades, modificando  las  banderas  (ya sa-
  17. béis, si da 0, entonces el flag Z se  activa;
  18. si no hay rebosamiento, es decir,  si  *cYAX*cR  es
  19. mayor que *cY2121h *cRentonces se activa el flag  A
  20. o el G (de Greater), y si *cY2121h *cRes mayor  que
  21. AX, entonces se activa el C (*cBCarry Flag*cR,  que
  22. también puede ser tratado  como  flag  B,  de
  23. *cBBelow*cR).
  24.   Si queremos comprobar esto, hay  diferentes
  25. maneras de hacerlo y que hacen lo  mismo  que
  26. *cYCMP XX, YYYY*cR. Por ejemplo:
  27.  
  28.    - Si *cTAX*cR no lo vamos  a  utilizar  después,
  29.   podemos usar la  instrucción  *cTXOR  *cRpara  la
  30.   comprobación, puesto que  si  hacemos  *cY XOR
  31.   AX, 2121h*cR, si *cTAX *cRes *cT2121h *cRéste se quedará a 
  32.   0, activándose el flag Z  como  en  *cTCMP*cR,  y
  33.   además *cTXOR *cRes más  rápido  que *cT CMP*cR.  Claro
  34.   está que aquí no nos habrá de  importar  si
  35.   *cTAX *cRestá por encima o por debajo en caso  de
  36.   que no sea 0.
  37.  
  38.    - En caso de que *cTAX  *cRqueramos  usarlo  des
  39.   pués, tendremos que usar *cTCMP*cR.
  40.  
  41.    - Si tan sólo quisiéramos mirar si  AX  es
  42.   0, hay varias maneras, y la más  lenta  (en
  43.   términos de procesador) es *cYCMP AX,  0*cR.  Hay
  44.   otras  maneras  más  rápidas,  en  concreto
  45.   todas las de operaciones a nivel  de  bits.
  46.   *cY«OR AX, AX»*cR, *cY«AND AX, AX»*cR y *cY«TEST  AX,  AX»*cR
  47.   encenderán el flag Z si AX es 0,  y  no  en
  48.   caso contrario, dejando además AX intacto.
  49.  
  50.   Y  después  están  las  bifurcaciones.  Las
  51. banderas sólo serán modificadas por operacio-
  52. nes e instrucciones, y nunca "porque sí", por 
  53. lo que no debemos temer que se modifiquen  si
  54. nosotros no  hemos  puesto  nada  para  ello.
  55. Entonces,  esto  nos  permite  hacer   varios
  56. saltos condicionales sin necesidad de  volver
  57. a comparar. Quiero decir, que no  es  preciso
  58. que antes de un salto  condicional  vaya  una
  59. instrucción de  cambio  de  banderas,  porque
  60. estas se conservan. Veamos un ejemplo:
  61.   Esto sería la manera sin optimizar:
  62. *cN
  63.         CMP   AX, 2121h
  64.         JZ    Opcion1
  65.         CMP   AX, 2121h
  66.         JB    Opcion2
  67.         CMP   AX, 2121h
  68.         JA    Opcion3
  69.         ...
  70. *cR
  71.   Y esto la manera optimizada:
  72. *cN
  73.         CMP  AX, 2121h
  74.         JZ   Opcion1
  75.         JA   Opcion2
  76.         JB   Opcion3
  77. *cR
  78.   La estructuración del  código  máquina  nos
  79. permite  hacer  esto  (y  encima,  queda  muy
  80. elegante).
  81.   Después, si os miráis la sección de "Técni-
  82. cas Víricas" veréis un montón de ejemplos  de
  83. optimizaciones de código, porque en un  virus
  84. se practica esto hasta  la  saciedad  (aunque
  85. más  las  optimizaciones  de  tamaño  que  de
  86. velocidad).
  87.   Más trucos. Imaginad que queremos saber  si
  88. AX es el valor 0FFFFh. Más rápido  que  hacer
  89. *cYCMP AX, 0FFFFh *cRes esto:
  90. *cN
  91.         INC  AX
  92.         JZ   Opcion1
  93. *cR
  94.   No es que  sea  gran  cosa,  pero  gana  en
  95. velocidad y vistosidad, y da la impresión  de
  96. que controlamos el  tema  (y,  de  hecho,  lo
  97. controlamos). Si fuera comprobar si AX es  1,
  98. pues hacemos *cYDEC AX*cR en vez de *cYINC AX*cR.
  99.   Bueno,  pues  en  el  próximo  número  más.
  100. Empezaremos con optimización  de  código nor-
  101. mal,  porque  espero  que  en   comparaciones
  102. hayais captado la idea.
  103.  
  104. *cN                         Líyak el Oscuro
  105.